home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / glibc108.gz / glibc108 / glibc-1.08.1 / sysdeps / mips / __longjmp.c next >
C/C++ Source or Header  |  1993-08-26  |  3KB  |  83 lines

  1. /* Copyright (C) 1992 Free Software Foundation, Inc.
  2.    Contributed by Brendan Kehoe (brendan@zen.org).
  3.  
  4. The GNU C Library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Library General Public License as
  6. published by the Free Software Foundation; either version 2 of the
  7. License, or (at your option) any later version.
  8.  
  9. The GNU C Library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. Library General Public License for more details.
  13.  
  14. You should have received a copy of the GNU Library General Public
  15. License along with the GNU C Library; see the file COPYING.LIB.  If
  16. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  17. Cambridge, MA 02139, USA.  */
  18.  
  19. #include <ansidecl.h>
  20. #include <setjmp.h>
  21. #include <stdlib.h>
  22.  
  23. #undef __longjmp
  24.  
  25. #ifndef    __GNUC__
  26.   #error This file uses GNU C extensions; you must compile with GCC.
  27. #endif
  28.  
  29. __NORETURN
  30. void
  31. DEFUN(__longjmp, (env, val_arg), CONST __jmp_buf env AND int val_arg)
  32. {
  33.   /* gcc 1.39.19 miscompiled the longjmp routine (as it did setjmp before
  34.      the hack around it); force it to use $a1 for the longjmp value.
  35.      Without this it saves $a1 in a register which gets clobbered
  36.      along the way.  */
  37.   register int val asm ("a1");
  38.  
  39.   /* Pull back the floating point callee-saved registers.  */
  40.   asm volatile ("l.d $f20, %0" : : "m" (env[0].__fpregs[0]));
  41.   asm volatile ("l.d $f22, %0" : : "m" (env[0].__fpregs[1]));
  42.   asm volatile ("l.d $f24, %0" : : "m" (env[0].__fpregs[2]));
  43.   asm volatile ("l.d $f26, %0" : : "m" (env[0].__fpregs[3]));
  44.   asm volatile ("l.d $f28, %0" : : "m" (env[0].__fpregs[4]));
  45.   asm volatile ("l.d $f30, %0" : : "m" (env[0].__fpregs[5]));
  46.   
  47.   /* Restore the stack pointer.  */
  48.   asm volatile ("lw $29, %0" : : "m" (env[0].__sp));
  49.  
  50.   /* Get and reconstruct the floating point csr.  */
  51.   asm volatile ("lw $2, %0" : : "m" (env[0].__fpc_csr));
  52.   asm volatile ("ctc1 $2, $31");
  53.  
  54.   /* Get the FP.  */
  55.   asm volatile ("lw $30, %0" : : "m" (env[0].__fp));
  56.  
  57.   /* Get the GP. */
  58.   asm volatile ("lw $gp, %0" : : "m" (env[0].__gp));
  59.  
  60.   /* Get the callee-saved registers.  */
  61.   asm volatile ("lw $16, %0" : : "m" (env[0].__regs[0]));
  62.   asm volatile ("lw $17, %0" : : "m" (env[0].__regs[1]));
  63.   asm volatile ("lw $18, %0" : : "m" (env[0].__regs[2]));
  64.   asm volatile ("lw $19, %0" : : "m" (env[0].__regs[3]));
  65.   asm volatile ("lw $20, %0" : : "m" (env[0].__regs[4]));
  66.   asm volatile ("lw $21, %0" : : "m" (env[0].__regs[5]));
  67.   asm volatile ("lw $22, %0" : : "m" (env[0].__regs[6]));
  68.   asm volatile ("lw $23, %0" : : "m" (env[0].__regs[7]));
  69.  
  70.   /* Get the PC.  */
  71.   asm volatile ("lw $31, %0" : : "m" (env[0].__pc));
  72.   
  73.   /* Give setjmp 1 if given a 0, or what they gave us if non-zero.  */
  74.   if (val == 0)
  75.     asm volatile ("li $2, 1");
  76.   else
  77.     asm volatile ("move $2, %0" : : "r" (val));
  78.  
  79.   asm volatile ("j $31");
  80.  
  81.   abort ();
  82. }
  83.